package com.ant.collect.excel;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Component
public class excelReader {
    /**
     * 读取原Excel并解析为图片格式的数据（严格匹配列顺序）
     * @param inputPath 原Excel路径（.xls或.xlsx）
     */
    public static List<IndustryCategory> readExcel(String inputPath) throws IOException {
        List<IndustryCategory> dataList = new ArrayList<>();

        try (FileInputStream fis = new FileInputStream(inputPath);
             Workbook workbook = inputPath.endsWith(".xls") ? new HSSFWorkbook(fis) : new XSSFWorkbook(fis)) {

            Sheet sheet = workbook.getSheetAt(0); // 读取第一个工作表
            int headerRowIndex = 0; // 表头行（第1行，索引0）
            Row headerRow = sheet.getRow(headerRowIndex);
            if (headerRow == null) {
                throw new RuntimeException("原Excel缺少表头，请确保表头为：code、name、parent_id、level");
            }

            // 从数据行开始读取（表头下一行，索引1及以后）
            for (int rowIndex = headerRowIndex + 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                Row dataRow = sheet.getRow(rowIndex);
                if (dataRow == null) continue;

                IndustryCategory category = new IndustryCategory();

                // 1. 读取code（第1列，索引0）：强制转为字符串（避免数字型code被识别为数字）
                Cell codeCell = dataRow.getCell(0);
                category.setCode(getStringValue(codeCell));

                // 2. 读取name（第2列，索引1）：直接取字符串值
                Cell nameCell = dataRow.getCell(1);
                category.setName(getStringValue(nameCell));

                // 3. 读取parent_id（第3列，索引2）：转为整数（空值为null）
                Cell parentIdCell = dataRow.getCell(2);
                Integer integerValue = getIntegerValue(parentIdCell);
                category.setParentId(integerValue);

                // 4. 读取level（第4列，索引3）：转为整数（空值为null）
                Cell levelCell = dataRow.getCell(3);
                category.setLevel(getIntegerValue(levelCell));

                dataList.add(category);
            }
        }
        return dataList;
    }

    /**
     * 将解析后的数据写入新Excel，格式与图片完全一致
     * @param dataList 处理后的数据
     * @param outputPath 新Excel保存路径
     */
    public static void writeExcel(List<IndustryCategory> dataList, String outputPath) throws IOException {
        try (Workbook workbook = outputPath.endsWith(".xls") ? new HSSFWorkbook() : new XSSFWorkbook();
             FileOutputStream fos = new FileOutputStream(outputPath)) {

            Sheet sheet = workbook.createSheet("Category Data"); // 创建工作表

            // 1. 写入表头（与图片一致：code、name、parent_id、level）
            String[] headers = {"code", "name", "parent_id", "level"};
            Row headerRow = sheet.createRow(0);
            CellStyle headerStyle = workbook.createCellStyle();
            Font headerFont = workbook.createFont();
            headerFont.setBold(true); // 表头加粗
            headerStyle.setFont(headerFont);

            for (int i = 0; i < headers.length; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(headers[i]);
                cell.setCellStyle(headerStyle);
                sheet.autoSizeColumn(i); // 自动调整列宽（适配内容）
            }

            // 2. 写入数据行（严格匹配图片列顺序）
            for (int i = 0; i < dataList.size(); i++) {
                IndustryCategory category = dataList.get(i);
                Row dataRow = sheet.createRow(i + 1); // 数据从第2行开始

                // code列（字符串，如"A"、"11"）
                dataRow.createCell(0).setCellValue(category.getCode());
                // name列（字符串，如"农、林、牧"）
                dataRow.createCell(1).setCellValue(category.getName());
                // parent_id列（整数，如0、1）
                if (category.getParentId() != null) {
                    dataRow.createCell(2).setCellValue(category.getParentId());
                }
                // level列（整数，如1、2）
                if (category.getLevel() != null) {
                    dataRow.createCell(3).setCellValue(category.getLevel());
                }
            }

            workbook.write(fos); // 写入文件
        }
    }

    /**
     * 单元格值转字符串（确保数字型code正确显示为字符串，如"11"而非11）
     */
    private static String getStringValue(Cell cell) {
        if (cell == null) return "";
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();
            case NUMERIC:
                // 数字转字符串（避免"11"被识别为数字11，转为字符串"11"）
                return String.valueOf((long) cell.getNumericCellValue()).trim();
            default:
                return "";
        }
    }

    /**
     * 单元格值转整数（处理空值和非数字格式）
     * @return
     */
    private static Integer getIntegerValue(Cell cell) {
        if (cell == null) return null;
        try {
            if (cell.getCellType() == CellType.NUMERIC) {
                return (int) cell.getNumericCellValue(); // 数字直接转整数
            } else if (cell.getCellType() == CellType.STRING) {
                return Integer.parseInt(cell.getStringCellValue().trim()); // 字符串转整数
            }
        } catch (Exception e) {
            // 非整数格式返回null（如空字符串）
            return null;
        }
        return null;
    }
    // 主方法测试
    public static void main(String[] args) {
        try {
            // 1. 读取并转换原Excel（替换为你的输入文件路径）
            List<IndustryCategory> formattedData = readExcel("f:/hb/123.xlsx");
            // 2. 写入新Excel（替换为你的输出文件路径）
            writeExcel(formattedData, "f:/hb/55.xlsx");
            System.out.println("处理完成！新Excel已生成。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
